From 06d19011db5fb8df9c891ea4a8266ff10477b28c Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 24 Jun 2014 22:04:57 -0700 Subject: [PATCH] Fix rm_rf on windows Apparently git checkouts have objects in the database with permissions 444 which need to be changed to something with a write permission before removal. --- tests/support/paths.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/support/paths.rs b/tests/support/paths.rs index b42f5bd69..99de20a22 100644 --- a/tests/support/paths.rs +++ b/tests/support/paths.rs @@ -33,9 +33,23 @@ impl PathExt for Path { */ fn rm_rf(&self) -> IoResult<()> { if self.exists() { + // On windows, apparently git checks out the database with objects + // set to the permission 444, and apparently you can't unlink a file + // with permissions 444 because you don't have write permissions. + // Whow knew! + // + // If the rmdir fails due to a permission denied error, then go back + // and change everything to have write permissions, then remove + // everything. + match fs::rmdir_recursive(self) { + Err(io::IoError { kind: io::PermissionDenied, .. }) => {} + e => return e, + } + for path in try!(fs::walk_dir(self)) { + try!(fs::chmod(&path, io::UserRWX)); + } fs::rmdir_recursive(self) - } - else { + } else { Ok(()) } } -- 2.30.2